package com.fileupload.upload.strategy;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fileupload.utils.PathUtils;

/**
 * 路径归档策略
 * 基于文件相对于监控目录的路径创建子目录
 */
public class PathArchiveStrategy implements ArchiveStrategy {
    
    private static final Logger logger = LoggerFactory.getLogger(PathArchiveStrategy.class);
    
    @Override
    public String buildArchivePath(String monitorDir, File file) {
        if (monitorDir == null || monitorDir.isEmpty() || file == null) {
            logger.warn("[路径归档策略] 监控目录或文件为空，无法构建路径");
            return "";
        }
        
        try {
            // 尝试使用绝对路径进行处理
            String filePath = file.getAbsolutePath();
            String normalizedMonitorDir = PathUtils.normalizePath(monitorDir);
            String normalizedFilePath = PathUtils.normalizePath(filePath);
            
            // 确保monitorDir以斜杠结尾
            if (!normalizedMonitorDir.endsWith("/")) {
                normalizedMonitorDir = normalizedMonitorDir + "/";
            }
            
            logger.info("[路径归档策略] 规范化后的监控目录: {}", normalizedMonitorDir);
            logger.info("[路径归档策略] 规范化后的文件路径: {}", normalizedFilePath);
            
            // 处理Windows系统盘符问题，比较路径时忽略盘符
            // 检查文件路径是否包含监控目录路径（考虑Windows盘符的影响）
            boolean pathProcessed = false;
            String subPath = "";
            
            // 方法1：直接比较（适用于相同盘符）
            if (normalizedFilePath.startsWith(normalizedMonitorDir)) {
                // 获取相对于监控目录的路径
                String relativePath = normalizedFilePath.substring(normalizedMonitorDir.length());
                logger.info("[路径归档策略] 相对路径: {}", relativePath);
                
                // 移除文件名，只保留路径部分
                int lastSlashIndex = relativePath.lastIndexOf('/');
                
                if (lastSlashIndex >= 0) {
                    subPath = relativePath.substring(0, lastSlashIndex);
                    logger.info("[路径归档策略] 子路径: {}", subPath);
                    pathProcessed = true;
                }
            } 
            // 方法2：忽略盘符进行比较（适用于不同盘符或无盘符情况）
            else {
                // 移除盘符部分进行比较
                String monitorDirWithoutDrive = PathUtils.removeDriveLetter(normalizedMonitorDir);
                String filePathWithoutDrive = PathUtils.removeDriveLetter(normalizedFilePath);
                
                logger.info("[路径归档策略] 移除盘符后的监控目录: {}", monitorDirWithoutDrive);
                logger.info("[路径归档策略] 移除盘符后的文件路径: {}", filePathWithoutDrive);
                
                if (filePathWithoutDrive.startsWith(monitorDirWithoutDrive)) {
                    // 调整relativePath的计算，基于移除盘符后的路径
                    String relativePath = filePathWithoutDrive.substring(monitorDirWithoutDrive.length());
                    logger.info("[路径归档策略] 相对路径(移除盘符): {}", relativePath);
                    
                    // 移除文件名，只保留路径部分
                    int lastSlashIndex = relativePath.lastIndexOf('/');
                    
                    if (lastSlashIndex >= 0) {
                        subPath = relativePath.substring(0, lastSlashIndex);
                        logger.info("[路径归档策略] 子路径(移除盘符): {}", subPath);
                        pathProcessed = true;
                    }
                }
            }
            
            if (!pathProcessed) {
                logger.warn("[路径归档策略] 文件路径不以监控目录开头，无法提取相对路径");
                return "";
            }
            
            return subPath + "/";
            
        } catch (Exception e) {
            logger.error("[路径归档策略] 处理路径失败: {}", e.getMessage(), e);
            return "";
        }
    }
    
    // 使用PathUtils代替内部方法
    

}